import java.util.Arrays;

public class QuickSort {
    public static void main(String[] args) {
        Integer[] array = {5, 8, 4, 6, 10, 9, 7, 3};
        System.out.println("\nQuickSortRoughVersion:");
        quickSort(array, 0, array.length - 1);
        System.out.println(Arrays.toString(array));
    }

    public static void quickSort(Integer[] array, Integer startIndex, Integer endIndex) {
        if (startIndex >= endIndex) {
            return;
        }
        int pivotIndex = partition(array, startIndex, endIndex);
        quickSort(array, startIndex, pivotIndex - 1);
        quickSort(array, pivotIndex + 1, endIndex);
    }

    public static int partition(Integer[] array, Integer startIndex, Integer endIndex) {
        // 基准点
        int pivot = array[startIndex];
        int left = startIndex;
        int right = endIndex;

        while (left != right) {
            // 注意，要让右指针先开始往左扫描 ， 不能与下面的while交换顺序
            // 因为我们是从小到大排序, 而 右指针 是可以包容大数的，如果让右指针先走，它碰到大数就直接包容了
            // 而如果让 左指针 先走，它如果遇到了大数(大于pivot)停下来，而右指针又迟迟遇不到小数(小于pivot)和那个大数交换
            // 最后的结果就是 左指针和右指针 最后碰头到了 一个大数(pivot), 难道你拿这个大数去 和 最左侧的 pivot交换么？
            // 这样就实现不了  左侧数 < pivot < 右侧数字
            while (left < right && array[right] > pivot) {
                right--;
            }

            while (left < right && array[left] <= pivot) {
                left++;
            }

            if (left < right) {
                int p = array[left];
                array[left] = array[right];
                array[right] = p;
            }
        }

        array[startIndex] = array[left];
        array[left] = pivot;
        return left;
    }
}